Code coverage report for src/state.js

Statements: 89.8% (44 / 49)      Branches: 79.17% (19 / 24)      Functions: 100% (8 / 8)      Lines: 93.33% (42 / 45)      Ignored: none     

All files » src/ » state.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 1221                                       1   188   1     1 1 188   188 188     1 168 175   175 175 8             8   8   8 1         1 168       168 1       167     167         167 18       167         1 98           98 106   106   106 66 60   40 40 37         98     1     1            
System.register([], function (_export) {
  // A State has a character specification and (`charSpec`) and a list of possible
  // subsequent states (`nextStates`).
  //
  // If a State is an accepting state, it will also have several additional
  // properties:
  //
  // * `regex`: A regular expression that is used to extract parameters from paths
  //   that reached this accepting state.
  // * `handlers`: Information on how to convert the list of captures into calls
  //   to registered handlers with the specified parameters.
  // * `types`: How many static, dynamic, or star segments in this route. Used to
  //   decide which route to use if multiple registered routes match a path.
  //
  // Currently, State is implemented naively by looping over `nextStates` and
  // comparing a character specification against a character. A more efficient
  // implementation would use a hash of keys pointing at one or more next states.
 
  'use strict';
 
  var State;
 
  function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
  return {
    setters: [],
    execute: function () {
      State = (function () {
        function State(charSpec) {
          _classCallCheck(this, State);
 
          this.charSpec = charSpec;
          this.nextStates = [];
        }
 
        State.prototype.get = function get(charSpec) {
          for (var _iterator = this.nextStates, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
            var _ref;
 
            Eif (_isArray) {
              if (_i >= _iterator.length) break;
              _ref = _iterator[_i++];
            } else {
              _i = _iterator.next();
              if (_i.done) break;
              _ref = _i.value;
            }
 
            var child = _ref;
 
            var isEqual = child.charSpec.validChars === charSpec.validChars && child.charSpec.invalidChars === charSpec.invalidChars;
 
            if (isEqual) {
              return child;
            }
          }
        };
 
        State.prototype.put = function put(charSpec) {
          var state = this.get(charSpec);
 
          // If the character specification already exists in a child of the current
          // state, just return that state.
          if (state) {
            return state;
          }
 
          // Make a new state for the character spec
          state = new State(charSpec);
 
          // Insert the new state as a child of the current state
          this.nextStates.push(state);
 
          // If this character specification repeats, insert the new state as a child
          // of itself. Note that this will not trigger an infinite loop because each
          // transition during recognition consumes a character.
          if (charSpec.repeat) {
            state.nextStates.push(state);
          }
 
          // Return the new state
          return state;
        };
 
        // Find a list of child states matching the next character
 
        State.prototype.match = function match(ch) {
          var nextStates = this.nextStates,
              results = [],
              child,
              charSpec,
              chars;
 
          for (var i = 0, l = nextStates.length; i < l; i++) {
            child = nextStates[i];
 
            charSpec = child.charSpec;
 
            if (typeof (chars = charSpec.validChars) !== 'undefined') {
              if (chars.indexOf(ch) !== -1) {
                results.push(child);
              }
            } else Eif (typeof (chars = charSpec.invalidChars) !== 'undefined') {
              if (chars.indexOf(ch) === -1) {
                results.push(child);
              }
            }
          }
 
          return results;
        };
 
        return State;
      })();
 
      _export('State', State);
 
      ;
    }
  };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3JvdXRlLXJlY29nbml6ZXIvc3JjL3N0YXRlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BaUJhLEtBQUs7Ozs7Ozs7QUFBTCxXQUFLO0FBQ0wsaUJBREEsS0FBSyxDQUNKLFFBQVEsRUFBRTtnQ0FEWCxLQUFLOztBQUVkLGNBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQ3pCLGNBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1NBQ3RCOztBQUpVLGFBQUssV0FNaEIsR0FBRyxHQUFBLGFBQUMsUUFBUSxFQUFFO0FBQ1osK0JBQWtCLElBQUksQ0FBQyxVQUFVLGtIQUFFOzs7Ozs7Ozs7Ozs7Z0JBQTFCLEtBQUs7O0FBQ1osZ0JBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxVQUFVLElBQ2pELEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxLQUFLLFFBQVEsQ0FBQyxZQUFZLENBQUM7O0FBRXBFLGdCQUFJLE9BQU8sRUFBRTtBQUNYLHFCQUFPLEtBQUssQ0FBQzthQUNkO1dBQ0Y7U0FDRjs7QUFmVSxhQUFLLFdBaUJoQixHQUFHLEdBQUEsYUFBQyxRQUFRLEVBQUU7QUFDWixjQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7O0FBSS9CLGNBQUksS0FBSyxFQUFFO0FBQ1QsbUJBQU8sS0FBSyxDQUFDO1dBQ2Q7OztBQUdELGVBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQzs7O0FBRzVCLGNBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7OztBQUs1QixjQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7QUFDbkIsaUJBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1dBQzlCOzs7QUFHRCxpQkFBTyxLQUFLLENBQUM7U0FDZDs7OztBQXpDVSxhQUFLLFdBNENoQixLQUFLLEdBQUEsZUFBQyxFQUFFLEVBQUU7QUFDUixjQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVTtjQUFFLE9BQU8sR0FBRyxFQUFFO2NBQzFDLEtBQUs7Y0FBRSxRQUFRO2NBQUUsS0FBSyxDQUFDOztBQUUzQixlQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pELGlCQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUV0QixvQkFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7O0FBRTFCLGdCQUFJLFFBQVEsS0FBSyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUEsQUFBQyxLQUFLLFdBQVcsRUFBRTtBQUN4RCxrQkFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQzVCLHVCQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2VBQ3JCO2FBQ0YsTUFBTSxJQUFJLFFBQVEsS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUEsQUFBQyxLQUFLLFdBQVcsRUFBRTtBQUNqRSxrQkFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQzVCLHVCQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2VBQ3JCO2FBQ0Y7V0FDRjs7QUFFRCxpQkFBTyxPQUFPLENBQUM7U0FDaEI7O2VBakVVLEtBQUs7Ozt1QkFBTCxLQUFLOztBQWtFakIsT0FBQyIsImZpbGUiOiIvVXNlcnMvRWlzZW5iZXJnRWZmZWN0L0RvY3VtZW50cy9HaXRIdWIvVGhlIER1cmFuZGFsIFByb2plY3QvYXVyZWxpYS9yb3V0ZS1yZWNvZ25pemVyL3NyYy9zdGF0ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEEgU3RhdGUgaGFzIGEgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24gYW5kIChgY2hhclNwZWNgKSBhbmQgYSBsaXN0IG9mIHBvc3NpYmxlXG4vLyBzdWJzZXF1ZW50IHN0YXRlcyAoYG5leHRTdGF0ZXNgKS5cbi8vXG4vLyBJZiBhIFN0YXRlIGlzIGFuIGFjY2VwdGluZyBzdGF0ZSwgaXQgd2lsbCBhbHNvIGhhdmUgc2V2ZXJhbCBhZGRpdGlvbmFsXG4vLyBwcm9wZXJ0aWVzOlxuLy9cbi8vICogYHJlZ2V4YDogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB1c2VkIHRvIGV4dHJhY3QgcGFyYW1ldGVycyBmcm9tIHBhdGhzXG4vLyAgIHRoYXQgcmVhY2hlZCB0aGlzIGFjY2VwdGluZyBzdGF0ZS5cbi8vICogYGhhbmRsZXJzYDogSW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnZlcnQgdGhlIGxpc3Qgb2YgY2FwdHVyZXMgaW50byBjYWxsc1xuLy8gICB0byByZWdpc3RlcmVkIGhhbmRsZXJzIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLlxuLy8gKiBgdHlwZXNgOiBIb3cgbWFueSBzdGF0aWMsIGR5bmFtaWMsIG9yIHN0YXIgc2VnbWVudHMgaW4gdGhpcyByb3V0ZS4gVXNlZCB0b1xuLy8gICBkZWNpZGUgd2hpY2ggcm91dGUgdG8gdXNlIGlmIG11bHRpcGxlIHJlZ2lzdGVyZWQgcm91dGVzIG1hdGNoIGEgcGF0aC5cbi8vXG4vLyBDdXJyZW50bHksIFN0YXRlIGlzIGltcGxlbWVudGVkIG5haXZlbHkgYnkgbG9vcGluZyBvdmVyIGBuZXh0U3RhdGVzYCBhbmRcbi8vIGNvbXBhcmluZyBhIGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIGFnYWluc3QgYSBjaGFyYWN0ZXIuIEEgbW9yZSBlZmZpY2llbnRcbi8vIGltcGxlbWVudGF0aW9uIHdvdWxkIHVzZSBhIGhhc2ggb2Yga2V5cyBwb2ludGluZyBhdCBvbmUgb3IgbW9yZSBuZXh0IHN0YXRlcy5cblxuZXhwb3J0IGNsYXNzIFN0YXRlIHtcbiAgY29uc3RydWN0b3IoY2hhclNwZWMpIHtcbiAgICB0aGlzLmNoYXJTcGVjID0gY2hhclNwZWM7XG4gICAgdGhpcy5uZXh0U3RhdGVzID0gW107XG4gIH1cblxuICBnZXQoY2hhclNwZWMpIHtcbiAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLm5leHRTdGF0ZXMpIHtcbiAgICAgIHZhciBpc0VxdWFsID0gY2hpbGQuY2hhclNwZWMudmFsaWRDaGFycyA9PT0gY2hhclNwZWMudmFsaWRDaGFycyAmJlxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5jaGFyU3BlYy5pbnZhbGlkQ2hhcnMgPT09IGNoYXJTcGVjLmludmFsaWRDaGFycztcblxuICAgICAgaWYgKGlzRXF1YWwpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1dChjaGFyU3BlYykge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuZ2V0KGNoYXJTcGVjKTtcblxuICAgIC8vIElmIHRoZSBjaGFyYWN0ZXIgc3BlY2lmaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBpbiBhIGNoaWxkIG9mIHRoZSBjdXJyZW50XG4gICAgLy8gc3RhdGUsIGp1c3QgcmV0dXJuIHRoYXQgc3RhdGUuXG4gICAgaWYgKHN0YXRlKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBhIG5ldyBzdGF0ZSBmb3IgdGhlIGNoYXJhY3RlciBzcGVjXG4gICAgc3RhdGUgPSBuZXcgU3RhdGUoY2hhclNwZWMpO1xuXG4gICAgLy8gSW5zZXJ0IHRoZSBuZXcgc3RhdGUgYXMgYSBjaGlsZCBvZiB0aGUgY3VycmVudCBzdGF0ZVxuICAgIHRoaXMubmV4dFN0YXRlcy5wdXNoKHN0YXRlKTtcblxuICAgIC8vIElmIHRoaXMgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24gcmVwZWF0cywgaW5zZXJ0IHRoZSBuZXcgc3RhdGUgYXMgYSBjaGlsZFxuICAgIC8vIG9mIGl0c2VsZi4gTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgdHJpZ2dlciBhbiBpbmZpbml0ZSBsb29wIGJlY2F1c2UgZWFjaFxuICAgIC8vIHRyYW5zaXRpb24gZHVyaW5nIHJlY29nbml0aW9uIGNvbnN1bWVzIGEgY2hhcmFjdGVyLlxuICAgIGlmIChjaGFyU3BlYy5yZXBlYXQpIHtcbiAgICAgIHN0YXRlLm5leHRTdGF0ZXMucHVzaChzdGF0ZSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBuZXcgc3RhdGVcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvLyBGaW5kIGEgbGlzdCBvZiBjaGlsZCBzdGF0ZXMgbWF0Y2hpbmcgdGhlIG5leHQgY2hhcmFjdGVyXG4gIG1hdGNoKGNoKSB7XG4gICAgdmFyIG5leHRTdGF0ZXMgPSB0aGlzLm5leHRTdGF0ZXMsIHJlc3VsdHMgPSBbXSxcbiAgICAgICAgY2hpbGQsIGNoYXJTcGVjLCBjaGFycztcblxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gbmV4dFN0YXRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNoaWxkID0gbmV4dFN0YXRlc1tpXTtcblxuICAgICAgY2hhclNwZWMgPSBjaGlsZC5jaGFyU3BlYztcblxuICAgICAgaWYgKHR5cGVvZiAoY2hhcnMgPSBjaGFyU3BlYy52YWxpZENoYXJzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKGNoYXJzLmluZGV4T2YoY2gpICE9PSAtMSkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIChjaGFycyA9IGNoYXJTcGVjLmludmFsaWRDaGFycykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChjaGFycy5pbmRleE9mKGNoKSA9PT0gLTEpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2goY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn07XG4iXX0=